/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @author Alexei Y. Zakharov
 */

package org.apache.harmony.jndi.provider.dns;

import org.apache.harmony.javax.naming.InvalidNameException;

/**
 * Contains various constants that are used in the provider classes.
 * 
 * @see RFC 1035
 */
public class ProviderConstants {

	// Constants that should be used as possible values for the header QR field
	public static final boolean QR_QUERY = false;
	public static final boolean QR_RESPONSE = true;

	// Message header masks
	public static final int QR_MASK = 0x8000;
	public static final int OPCODE_MASK = 0x7800;
	public static final int AA_MASK = 0x400;
	public static final int TC_MASK = 0x200;
	public static final int RD_MASK = 0x100;
	public static final int RA_MASK = 0x80;
	public static final int Z_MASK = 0x70;
	public static final int RCODE_MASK = 0xf;

	// Message header fields shifts
	public static final int OPCODE_SHIFT = 11;
	public static final int RCODE_SHIFT = 0;

	// Constants that can be used as OPCODEs in the header
	public static final int QUERY = 0;
	public static final int IQUERY = 1;
	public static final int STATUS = 2;

	// Constants that can be used as RCODEs in the header
	public static final int NO_ERROR = 0;
	public static final int FORMAT_ERROR = 1;
	public static final int SERVER_FAILURE = 2;
	public static final int NAME_ERROR = 3;
	public static final int NOT_IMPLEMENTED = 4;
	public static final int REFUSED = 5;

	// Possible TYPE values
	public static final int A_TYPE = 1;
	public static final int NS_TYPE = 2;
	public static final int MD_TYPE = 3;
	public static final int MF_TYPE = 4;
	public static final int CNAME_TYPE = 5;
	public static final int SOA_TYPE = 6;
	public static final int MB_TYPE = 7;
	public static final int MG_TYPE = 8;
	public static final int MR_TYPE = 9;
	public static final int NULL_TYPE = 10;
	public static final int WKS_TYPE = 11;
	public static final int PTR_TYPE = 12;
	public static final int HINFO_TYPE = 13;
	public static final int MINFO_TYPE = 14;
	public static final int MX_TYPE = 15;
	public static final int TXT_TYPE = 16;
	public static final int AAAA_TYPE = 28;
	public static final int SRV_TYPE = 33;

	// Possible QTYPE values
	public static final int AXFR_QTYPE = 252;
	public static final int MAILB_QTYPE = 253;
	public static final int MAILA_QTYPE = 254;
	public static final int ANY_QTYPE = 255;

	public static String[] rrTypeNames;
	public static String[] rrClassNames;

	// Possible CLASS values
	public static final int IN_CLASS = 1;
	public static final int CS_CLASS = 2;
	public static final int CH_CLASS = 3;
	public static final int HS_CLASS = 4;

	// Possible QCLASS values
	public static final int ANY_QCLASS = 255;

	// Maximum lengths
	public static final int LABEL_MAX_CHARS = 63;
	public static final int NAME_MAX_CHARS = 255;

	// default DNS port
	public static final int DEFAULT_DNS_PORT = 53;

	// Resolver settings
	public static final int DEFAULT_INITIAL_TIMEOUT = 1000;
	public static final int DEFAULT_TIMEOUT_RETRIES = 4;
	public static final boolean DEFAULT_AUTHORITATIVE = false;
	public static final boolean DEFAULT_RECURSION = true;
	public static final int DEFAULT_LOOKUP_ATTR_TYPE = TXT_TYPE;
	public static final int DEFAULT_LOOKUP_ATTR_CLASS = IN_CLASS;
	public static final int DEFAULT_MAX_THREADS = 7;

	public static final DNSName ROOT_ZONE_NAME_OBJ;

	// public static final String LOGGER_NAME =
	// "org.apache.harmony.jndi.provider.dns";

	static {
		// Resource Record types
		// commented out types are not supported
		rrTypeNames = new String[256];
		for (int i = 0; i < 256; i++) {
			rrTypeNames[i] = String.valueOf(i);
		}
		rrTypeNames[A_TYPE] = "A"; //$NON-NLS-1$
		rrTypeNames[NS_TYPE] = "NS"; //$NON-NLS-1$
		// rrTypeNames[MD_TYPE] = "MD";
		// rrTypeNames[MF_TYPE] = "MF";
		rrTypeNames[CNAME_TYPE] = "CNAME"; //$NON-NLS-1$
		rrTypeNames[SOA_TYPE] = "SOA"; //$NON-NLS-1$
		// rrTypeNames[MB_TYPE] = "MB";
		// rrTypeNames[MG_TYPE] = "MG";
		// rrTypeNames[MR_TYPE] = "MR";
		// rrTypeNames[NULL_TYPE] = "NULL";
		// rrTypeNames[WKS_TYPE] = "WKS";
		rrTypeNames[PTR_TYPE] = "PTR"; //$NON-NLS-1$
		rrTypeNames[HINFO_TYPE] = "HINFO"; //$NON-NLS-1$
		// rrTypeNames[MINFO_TYPE] = "MINFO";
		rrTypeNames[MX_TYPE] = "MX"; //$NON-NLS-1$
		rrTypeNames[TXT_TYPE] = "TXT"; //$NON-NLS-1$
		rrTypeNames[AAAA_TYPE] = "AAAA"; //$NON-NLS-1$
		rrTypeNames[SRV_TYPE] = "SRV"; //$NON-NLS-1$
		// rrTypeNames[AXFR_QTYPE] = "AXFR";
		// rrTypeNames[MAILB_QTYPE] = "MAILB";
		// rrTypeNames[MAILA_QTYPE] = "MAILA";
		rrTypeNames[ANY_QTYPE] = "*"; //$NON-NLS-1$

		// Resource Record classes
		rrClassNames = new String[256];
		for (int i = 0; i < 256; i++) {
			rrClassNames[i] = String.valueOf(i);
		}
		rrClassNames[IN_CLASS] = "IN"; //$NON-NLS-1$
		rrClassNames[HS_CLASS] = "HS"; //$NON-NLS-1$
		rrClassNames[ANY_QCLASS] = "*"; //$NON-NLS-1$

		// Root zone name
		DNSName root = null;
		try {
			root = (DNSName) ((new DNSNameParser()).parse(".")); //$NON-NLS-1$
		} catch (final InvalidNameException e) {
			// ignore
		}
		ROOT_ZONE_NAME_OBJ = root;
	}
}
